function [SS,ExitFlag]=SteadyState_Solver_Newton(PP,SS,SS_Res_Setup,Input_0)

%% Initial Step
LogInput    =   log(Input_0);
Input       =   Input_0;
TempFun     =   @(LogInput,UCoef)SteadyState_Solver_Res(PP,SS,SS_Res_Setup,exp(LogInput),UCoef);
LL          =   length(Input_0);
UCoef       =   [];
ItTol       =   1e-6;
MaxItNum    =   20;
fdstep      =   min(1e-6,ItTol);
hh          =   fdstep;
HH          =   cell(LL,2);
for ii=1:LL
    HH{ii,1}    =   zeros(LL,1);
    HH{ii,1}(ii)=   -hh;
    HH{ii,2}    =   zeros(LL,1);
    HH{ii,2}(ii)=   hh;
end
for ItNum=0:MaxItNum
    [RES,UCoef,SS]      =   TempFun(LogInput,UCoef);
    Diff                =   max(abs(RES));
    if PP.InfoPrint>=2
        fprintf(['Newton Update ',num2str(ItNum),': Max Res=',num2str(Diff,'%.2e'),'\n']);
    end 
    if Diff<ItTol
        break;
    end
    %----------------------------------------------------------------------
    % Parallel Implementation
    %----------------------------------------------------------------------
    DiffCell            =   cell(size(HH));
    parfor ii=1:numel(HH)
        DiffCell{ii}        =   TempFun(LogInput+HH{ii},UCoef);
    end
%     Jac                 =   [DiffCell{1,2}-DiffCell{1,1}, ...
%                              DiffCell{2,2}-DiffCell{2,1},...
%                              DiffCell{3,2}-DiffCell{3,1},...
%                              DiffCell{4,2}-DiffCell{4,1}] ...
%                             /fdstep/2;
    Jac                 =   (cat(2,DiffCell{:,2})-cat(2,DiffCell{:,1}))/fdstep/2;
    %----------------------------------------------------------------------
    % Non-parallel Implementation
    %----------------------------------------------------------------------  
    LogInput        =   LogInput-Jac\RES;
%     Input            =   Input-Jac\RES;
end

if max(abs(Diff))<ItTol && ItNum<=MaxItNum
    ExitFlag        =   1;
else
    ExitFlag        =   0;
end